#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

//一、函数默认参数
//定义函数参数时给定值[例如void function(int a, int b = 10)]
//如果我们自己传入数据，就用传入的数据，如果没有就用默认值

//注意事项
//1.默认参数放最后
//2.函数声明有了默认参数，函数定义时就不写。反之一样。
 



//二、函数占位参数(现阶段不会用)
//语法： 返回值类型 函数名（数据类型）{}
//调用函数时必须填补该位置
//占位参数可以是默认参数，函数调用时就不需要填补

void func(int a, int)
{
	cout << "this is func" << endl;
}
int main()
{
	func(10, 10); //占位参数必须填补

	return 0;
}




//三、函数重载
//(1)不同的函数，在同一个作用域下
//(2)可以函数名相同
//(3)通过函数参数的类型、个数和顺序来区分
//注意: 函数的返回值不可以作为函数重载的条件

void func()
{
	cout << "func的调用" << endl;
}

void func(int a, double b)
{
	cout << a + b << endl;
}

void func(int a, int b, int c)
{
	cout << a + b + c << endl;
}
double func(double b, int a)
{
	return a + b;
}

int main()
{
	func();
	func(10, 20, 30);
	func(10, 3.14);
	cout << func(3.14, 10) << endl;
	return 0;
}


//函数重载的注意事项

//1.引用作为重载的条件
void func(int &a)  //int &a = 10; 不合法，引用必须是一段内存空间
{
	cout << "func(int &a)的调用" << endl;
}

void func(const int &a)
{
	cout << "func(const int &a)的调用" << endl;
}


//2.函数重载 + 默认参数
void func2(int a, int b = 10)
{
	cout << "func2(int a, int b = 10)的调用" << endl;
}

void func2(int a)
{
	cout << "func2(int a)的调用" << endl;
}

int main()
{
	int a = 10;
	func(a);  //a为变量，属于int 类型
	func(10); //10为常量，属于const int 类型,const修饰为只读，不可更改
	//func2(10);   //此时语法出错，出现二义性，避免这种情况
	func2(10, 20); //调用第一个
}


